<?php

header('Content-type:text/html;charset=utf8');

class Code{
  // 验证码个数$number
  protected $number;
  // 验证码类型$codeType
  protected $codeType;
  // 验证码图像宽度$width
  protected $width;
  // 验证码$height
  protected $height;
  // 验证码字符串$code
  protected $code;
  // 图像资源$image
  protected $image;
   
  public function __construct($number=4,$codeType=0,$height=50,$width=100){
    //初始化自己的成员属性
    $this->number=$number;
    $this->codeType=$codeType;
    $this->width = $width;
    $this->height= $height;
     
    //生成验证码函数
    $this->code = $this ->createCode();
     
  }
  public function __get($name){
    if ($name == 'code'){
      return $this->code;
    }
    return false;
  }
  /*获取验证码*/
  public function getCode() {
    return $this->code;
  }
  /*图像资源销毁*/
  public function __destruct(){
    imagedestroy($this->image);
  }
  protected function createCode(){
    //通过你的验证码类型生成验证码
    switch ($this->codeType){
      case 0: //纯数字
        $code = $this->getNumberCode();
        break;
      case 1: //纯字母的
        $code = $this->getCharCode();
        break;
      case 2: //数字和字母混合
        $code = $this->getNumCharCode();
        break;
      default:
        die('不支持此类验证码类型');
    }
    return $code;
  }
  protected function getNumberCode(){
    $str = join('', range(0, 9));
    return substr(str_shuffle($str),0, $this->number);
  }
  protected function getCharCode(){
    $str = join('', range('a', 'z'));
    $str = $str.strtoupper($str);
    return substr(str_shuffle($str),0,$this->number);
  }
  protected function getNumCharCode(){
    $numstr = join('',range(0, 9));
    $str =join('', range('a', 'z'));
    $str =$numstr.$str.strtoupper($str);
    return substr(str_shuffle($str), 0,$this->number);
  }
  protected function createImage(){
    $this->image = imagecreatetruecolor($this->width, 
        $this->height);
  }
  protected function fillBack(){
    imagefill($this->image, 0, 0, $this->lightColor());
  }
  /*浅色*/
  protected function lightColor(){
    return imagecolorallocate($this->image, mt_rand(133,255), mt_rand(133,255), mt_rand(133,255));
  }
  /*深色*/
  protected function darkColor(){
    return imagecolorallocate($this->image, mt_rand(0,120), mt_rand(0,120), mt_rand(0,120));
  }
  protected function drawChar(){
    $width = ceil($this->width / $this->number);
    for ($i=0; $i< $this->number;$i++){
      $x = mt_rand($i*$width+5, ($i+1)*$width-10);
      $y = mt_rand(0, $this->height -15);
      imagechar($this->image, 5, $x, $y, $this->code[$i], $this->darkColor());
    }
  }
  protected function drawLine(){
    for ($i=0;$i<5;$i++) {
      imageline($this->image,mt_rand(0,$this->width),mt_rand(0,$this->height),mt_rand(0,$this->width),mt_rand(0,$this->height),$this->darkColor());
    }
  }
  protected function drawDisturb(){
    for ($i=0;$i<150;$i++){
      $x=mt_rand(0, $this->width);
      $y=mt_rand(0, $this->height);
      imagesetpixel($this->image, $x, $y, $this->lightColor());
    }
  }
  protected function show(){
    header('Content-Type:image/png');
    imagepng($this->image);
  }
  public function outImage(){
//     创建画布
    $this->createImage();
//     填充背景色
    $this->fillBack();
//     将验证码字符串花到画布上
    $this->drawChar();
//     添加干扰元素
    $this->drawDisturb();
//     添加线条
    $this->drawLine();
//     输出并显示
    $this->show();
  }
}

// session_start();
 
// $code= new Code(4,1,50,100);
// $_SESSION['code']= $code->getCode();
// $code->outImage();


/**
 * 生成缩略图
 * @param string $filename
 * @param string $destination
 * @param int $dst_w
 * @param int $dst_h
 * @param bool $isReservedSource
 * @param number $scale
 * @return string
 */
function thumb($filename,$destination=null,$dst_w=null,$dst_h=null,$isReservedSource=true,$scale=0.5){
  list($src_w,$src_h,$imagetype)=getimagesize($filename);
  if(is_null($dst_w)||is_null($dst_h)){
    $dst_w=ceil($src_w*$scale);
    $dst_h=ceil($src_h*$scale);
  }
  $mime=image_type_to_mime_type($imagetype);
  $createFun=str_replace("/", "createfrom", $mime);
  $outFun=str_replace("/", null, $mime);
  $src_image=$createFun($filename);
  $dst_image=imagecreatetruecolor($dst_w, $dst_h);
  imagecopyresampled($dst_image, $src_image, 0,0,0,0, $dst_w, $dst_h, $src_w, $src_h);
  if($destination&&!file_exists(dirname($destination))){
    mkdir(dirname($destination),0777,true);
  }
  $dstFilename=$destination==null?getUniName().".".getExt($filename):$destination;
  $outFun($dst_image,$dstFilename);
  imagedestroy($src_image);
  imagedestroy($dst_image);
  if(!$isReservedSource){
    unlink($filename);
  }
  return $dstFilename;
}



/**
 *添加文字水印
 * @param string $filename
 * @param string $text
 * @param string  $fontfile
 */
function waterText($dst_path,$text="快乐编程",$fontfile="MSYH.TTF"){
	//创建图片的实例
	$dst = imagecreatefromstring(file_get_contents($dst_path));

	//打上文字
	$font = '../FONTS/MSYH.TTF';//字体路径

	$color = imagecolorallocate($dst, 0x00, 0x00, 0x00);//字体颜色
	imagefttext($dst, 13, 0, 20, 20, $color, $font, '快乐编程');
	//输出图片
	list($dst_w, $dst_h, $dst_type) = getimagesize($dst_path);
	switch ($dst_type) {
		case 1://GIF
			header('Content-Type: image/gif');
			imagegif($dst);
			break;
		case 2://JPG
			header('Content-Type: image/jpeg');
			imagejpeg($dst);
			break;
		case 3://PNG
			header('Content-Type: image/png');
			imagepng($dst);
			break;
		default:
			break;
	}
}

/**
 *添加图片水印
 * @param string $dstFile
 * @param string $srcFile
 * @param int $pct
 */
function waterPic($dstFile,$srcFile="../images/logo.jpg",$pct=30){
	$groundImg = $dstFile;
	$groundInfo = getimagesize($groundImg);
	$ground_w = $groundInfo[0];
	//print_r($groundInfo);
	$ground_h = $groundInfo[1];
	switch($groundInfo[2]){
	case 1:
	$ground_im = imagecreatefromgif($groundImg);
	break;
	case 2:
	$ground_im = imagecreatefromjpeg($groundImg);
	break;
	case 3:
	$ground_im = imagecreatefrompng($groundImg);
	break;
	}

	$waterImg = $srcFile;
	$imgInfo =getimagesize($waterImg);
	$water_w = $imgInfo[0];
	$water_h = $imgInfo[1];

	switch($imgInfo[2]){
	case 1:
	$water_im = imagecreatefromgif($waterImg);
	break;
	case 2:
	$water_im = imagecreatefromjpeg($waterImg);
	break;
	case 3:
	$water_im = imagecreatefrompng($waterImg);
	break;
	}
	// imagecopy($ground_im,$water_im,100,100,0,0,500,500);
	imagecopymerge($ground_im, $water_im, 0,0,0,0, $water_w, $water_h,$pct);
	header("Content-type: image/jpeg");

	imagejpeg($ground_im);
}


